<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 定义父类
      function Person(name, sex) {
        this.name = name;
        this.sex = sex;
        this.fn = function(){
          console.log("....");
        }
      }
      Person.prototype.addr = "河南";
      Person.prototype.eat = function () {
        return this.name + "最爱吃水果";
      };
      //  定义子类
      function Student(name, sex, age) {
        //用arguments时 形参要先写父类的参数，再写子类的参数，参数的顺序不能颠倒
    // 继承的第一步：继承父类构造器上的属性和方法
        // Person.call(this, name, sex);
        Person.apply(this, arguments); //arguments:获取传递过来的实参 适用于参数较多情况
        // console.log(arguments);

        this.age = age;
        this.study = function (course) {
          console.log(this.name + "最爱学" + course);
        };
      }

  /* // 继承的第二步：继承父类原型链上的属性和方法
      Student.prototype= new Person(); //问题多出了父类构造器中的空属性 */
      //实现继承父类原型链上的属性和方法，不会多出父类构造器中的空属性
      Student.prototype = Object.create(Person.prototype);
     /*  Student.prototype = Person.prototype; 
      不可以直接将Person.prototype的赋给Student.prototype 因为这样他们共用一段地址空间，对Student修改时Person也会被修改 */

   //继承的第三步：找回丢失的构造器器
      Student.prototype.constructor = Student;
      var stu1 = new Student("王大头", "女", 18);
      console.log(stu1);
      console.log(stu1.eat());
      stu1.study("编程");
    </script>
  </body>
</html>
